在認識了 M1 卡的資料結構後,讓均民帶你使用變色龍來讀取 M1 卡的資料吧!
非加密的 M1 卡,代表卡片的金鑰是常見的金鑰,所以在已知金鑰的情況下就能直接讀取卡片的資料。請把一個非加密的 M1 卡放在變色龍裝置的正面,然後執行以下的程式碼:
// 在測試網頁的開發者工具中執行 https://taichunmin.idv.tw/chameleon-ultra.js/test.html
await (async ultra => {
const { Buffer, Mf1KeyType } = await import('https://cdn.jsdelivr.net/npm/chameleon-ultra.js@0/+esm')
const bufToHex = buf => buf?.toString('hex').toUpperCase()
const key = Buffer.from('FFFFFFFFFFFF', 'hex') // 非加密的 M1 卡金鑰通常是 FFFFFFFFFFFF
const keyType = Mf1KeyType.KEY_A // 使用金鑰 A
const dump = Buffer.alloc(1024) // 用來存放讀取到的資料,M1 卡總共有 1024 位元組的資料
for (let i = 0; i < 64; i++) {
try {
// 讀取一個區塊 (Block)
const block = await ultra.cmdMf1ReadBlock({ block: i, key, keyType })
dump.set(block, i * 16) // 將讀取到的區塊資料存放到對應的位置
} catch (err) {
console.error(`無法讀取區塊 ${i}`) // 如果讀取失敗,顯示錯誤訊息
}
}
console.log('讀取到的卡片內容為:')
// 將讀取到的資料分成每 16 位元組一組,轉成 hex 格式並顯示
console.log(dump.chunk(16).map(bufToHex).join('\n'))
})(vm.ultra)
執行結果如下:
UID 魔術卡有後門指令,可以無視金鑰與存取權限直接讀取卡片的資料,請把一個 UID 魔術卡放在變色龍裝置的正面,然後執行以下的程式碼:
// 在測試網頁的開發者工具中執行 https://taichunmin.idv.tw/chameleon-ultra.js/test.html
await (async ultra => {
const bufToHex = buf => buf?.toString('hex').toUpperCase()
// 讀取 UID 魔術卡的所有區塊
const dump = await ultra.mf1Gen1aReadBlocks(0, 64)
console.log('讀取到的卡片內容為:')
// 將讀取到的資料分成每 16 位元組一組,轉成 hex 格式並顯示
console.log(dump.chunk(16).map(bufToHex).join('\n'))
})(vm.ultra)
執行結果如下: